作者:ha遗忘的密 | 来源:互联网 | 2023-07-27 18:42
篇首语:本文由编程笔记#小编为大家整理,主要介绍了ElasticSearch基本操作相关的知识,希望对你有一定的参考价值。
文章目录
- 1.ElasticSearch 简介
- 2.索引库操作
- 2.1.mapping 属性
- 2.2.索引库CRUD
- 3.文档操作
- 3.1.新增文档
- 3.2查询文档
- 3.3删除文档
- 3.4修改文档
- 4.RestClient
- 4.1准备工作
- 4.2.RestClient操作索引库
- 4.3.RestClient操作文档
1.ElasticSearch 简介
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。可以帮助我们从海量数据中快速找到需要的内容。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的。
概念对比
mysql | Elasticsearch | 说明 |
---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | 映射(Mapping)是索引中文档的约束,例如字段类型约束。类似数据库的表结构 |
SQL | DSL | DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD |
优点对比
- Mysql:擅长事务类型操作,可以确保数据的安全和一致性
- Elasticsearch:擅长海量数据的搜索、分析、计算
2.索引库操作
2.1.mapping 属性
mapping 是对索引库中文档的约束,常见的mapping属性包括
- type:字段类型
- 字符串:text(可分词的文本)、keyword(精确值,不可拆分的词)
- 数值:long、integer、short、byte 、double、float
- 布尔:boolean
- 日期:date
- 对象:object
- index:是否创建倒排索引,默认为true
- analyzer:使用哪种分词器,一般与text联合使用
- properties:该字段的子字段
更多mapping属性可查阅Elastic官方文档
2.2.索引库CRUD
创建索引库
【语法】
PUT /索引库名
"mappings":
"properties":
"字段名1":
"type": "text",
"analyzer": "ik_smart"
,
"字段名2":
"type": "object",
"properties":
"子字段":
"type": "keyword"
,
【案例】
查询索引库
【语法】
GET /索引库名
【案例】
GET /why
删除索引库
【语法】
DELETE /索引库名
【案例】
DELETE /why
修改索引库
索引库只能添加新的字段,索引库一旦创建就无法修改
【案例】
PUT /索引库名/_mapping
properties:
"新的字段名":
"type": "integer"
【案例】
3.文档操作
3.1.新增文档
【语法】
POST /索引库名称/_doc/文档id
"字段1": "值1",
"字段2": "值2",
"字段3":
"子属性1": "值3",
"子属性2": "值4"
,
【案例】
3.2查询文档
【语法】
GET /索引库/_doc/文档id
【案例】
GET /why/_doc/1
3.3删除文档
【语法】
DELETE /索引库/_doc/文档id
【案例】
DELETE /why/_doc/1
3.4修改文档
【全量修改语法】
PUT /索引库名/_doc/文档id
"字段1": "值1",
"字段1": "值1",
【增量修改语法】
POST /索引库名/_update/文档id
"doc":
"字段名" :"新的值"
【案例】
两种修改方式的区别
- 全量修改:这种方式会删除旧的文档,如果id存在就修改文档,如果id不存在就新增文档
- 增量修改:这种方式只修改某个字段,如果id存在就修改字段,如果id不存在报404
4.RestClient
官方文档地址
4.1准备工作
一、导入工程和数据库
本文素材来自黑马张老师的视频
二、引入依赖
<properties>
<java.version>1.8java.version>
<elasticsearch.version>7.12.1elasticsearch.version>
properties>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.12.1version>
dependency>
dependencies>
三、初始化JavaRestClient
private RestHighLevelClient client;
&#64;BeforeEach
void init()
this.client &#61; new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.140.130:9200")
));
&#64;AfterEach
void close() throws IOException
this.client.close();
4.2.RestClient操作索引库
创建索引库
&#64;Test
void testCreateHotelIndex() throws IOException
CreateIndexRequest request &#61; new CreateIndexRequest("hotel");
request.source(MAPPINF_TEMPLATE,XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
判断索引库是否存在
&#64;Test
void testIsExistHotelIndex() throws IOException
GetIndexRequest request &#61; new GetIndexRequest("hotel");
boolean exists &#61; client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println("索引库是否存在&#xff1a;"&#43;exists);
删除索引库
&#64;Test
void testDeleteHotelIndex() throws IOException
DeleteIndexRequest request &#61; new DeleteIndexRequest("hotel");
client.indices().delete(request, RequestOptions.DEFAULT);
4.3.RestClient操作文档
添加文档
&#64;Test
void testAddIndexDocument() throws IOException
Hotel hotel &#61; hotelService.getById(61083L);
HotelDoc hotelDoc &#61; new HotelDoc(hotel);
IndexRequest request &#61; new IndexRequest("hotel").id(hotel.getId().toString());
String source &#61; JSON.toJSONString(hotelDoc);
request.source(source,XContentType.JSON);
client.index(request,RequestOptions.DEFAULT);
查询文档
&#64;Test
void testGetIndexDocument() throws IOException
GetRequest request &#61; new GetRequest("hotel","61083");
GetResponse documentFields &#61; client.get(request, RequestOptions.DEFAULT);
String json &#61; documentFields.getSourceAsString();
HotelDoc hotelDoc &#61; JSON.parseObject(json, HotelDoc.class);
System.err.println(hotelDoc);
更新文档
&#64;Test
void testUpdateIndexDocument() throws IOException
UpdateRequest request &#61; new UpdateRequest("hotel","61083");
request.doc(
"price","999",
"score","50"
);
client.update(request,RequestOptions.DEFAULT);
删除文档
&#64;Test
void deleteIndexDocument() throws IOException
DeleteRequest request &#61; new DeleteRequest("hotel","61083");
client.delete(request,RequestOptions.DEFAULT);
批量导入文档
&#64;Test
void testMultipleAddIndexDocument() throws IOException
List<Hotel> hotels &#61; hotelService.list();
BulkRequest request &#61; new BulkRequest();
for (Hotel hotel : hotels)
HotelDoc hotelDoc &#61; new HotelDoc(hotel);
request.add(new IndexRequest("hotel")
.id(hotelDoc.getId().toString())
.source(JSON.toJSONString(hotelDoc),XContentType.JSON));
client.bulk(request,RequestOptions.DEFAULT);